Tensorarrayread
从张量数组中读取指定索引的张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。
\[\text{output\_data} = \text{handle\_data}[\text{index}]\]
该算子会将 handle_data[index] 指向的数据复制到 output_data 中,复制的大小为 handle_size[index] 字节。
- 输入:
handle_data - 张量数组的数据指针数组(void** 类型),每个元素指向一个张量的数据。
handle_size - 每个张量的大小数组(int* 类型),handle_size[i] 表示 handle_data[i] 指向的数据大小(字节)。
index - 读取的索引(int 类型),指定从 handle_data 数组中读取哪个张量。
core_mask - 核掩码(int),仅共享存储版本需要。
- 输出:
output_data - 输出数据指针(void* 类型),包含复制后的数据。
output_size - 输出大小指针(int* 类型),指向存储输出大小的变量。调用后,*output_size 会被设置为 handle_size[index]。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持fp32, int16, int32, cplx64
MT7004 支持fp16, fp32, int16, int32, cplx64
算子会复制数据,输出数据与输入数据独立
调用前需要确保 output_data 指向的内存空间足够大(至少 handle_size[index] 字节)
index 必须在 handle_data 数组的有效范围内
共享存储版本:
-
void fp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void hp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void dp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void i8_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void i16_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void i32_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void c64_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
-
void c128_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <tensorarrayread.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在DDR空间
7 // 张量数组包含3个张量
8 float *data0 = (float *)0xA0000000; // 第0个张量的数据
9 float *data1 = (float *)0xA1000000; // 第1个张量的数据
10 float *data2 = (float *)0xA2000000; // 第2个张量的数据
11
12 // 每个张量的大小(字节)
13 int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
14
15 // 创建数据指针数组
16 void* handle_data[3] = {data0, data1, data2};
17
18 // 输出数据
19 float *output_data = (float *)0xB0000000; // 需要预先分配足够的内存
20 int output_size; // 输出大小,调用后会被设置
21
22 int index = 1; // 读取第1个张量
23 int core_mask = 0xff;
24
25 fp_tensorarrayread_s(handle_data, sizes, index, output_data, &output_size, core_mask);
26
27 // 此时 output_data 包含 data1 的副本
28 // output_size == sizes[1] == 1000 * sizeof(float)
29
30 return 0;
31}
私有存储版本:
-
void fp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void hp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void dp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void i8_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void i16_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void i32_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void c64_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
-
void c128_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <tensorarrayread.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在L2空间
7 float *data0 = (float *)0x10000000;
8 float *data1 = (float *)0x10001000;
9 float *data2 = (float *)0x10002000;
10
11 int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
12
13 void* handle_data[3] = {data0, data1, data2};
14
15 float *output_data = (float *)0x10003000; // 需要预先分配足够的内存
16 int output_size;
17
18 int index = 0; // 读取第0个张量
19
20 fp_tensorarrayread_p(handle_data, sizes, index, output_data, &output_size);
21
22 return 0;
23}